{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DataFrame Operations\n",
    "\n",
    "## About the Data\n",
    "In this notebook, we will be working with 2 data sets:\n",
    "- Facebook's stock price throughout 2018 (obtained using the [`stock_analysis` package](https://github.com/stefmolin/stock-analysis)).\n",
    "- daily weather data for NYC from the [National Centers for Environmental Information (NCEI) API](https://www.ncdc.noaa.gov/cdo-web/webservices/v2).\n",
    "\n",
    "*Note: The NCEI is part of the National Oceanic and Atmospheric Administration (NOAA) and, as you can see from the URL for the API, this resource was created when the NCEI was called the NCDC. Should the URL for this resource change in the future, you can search for the NCEI weather API to find the updated one.*\n",
    "\n",
    "## Background on the weather data\n",
    "\n",
    "Data meanings:\n",
    "- `AWND`: average wind speed\n",
    "- `PRCP`: precipitation in millimeters\n",
    "- `SNOW`: snowfall in millimeters\n",
    "- `SNWD`: snow depth in millimeters\n",
    "- `TMAX`: maximum daily temperature in Celsius\n",
    "- `TMIN`: minimum daily temperature in Celsius\n",
    "\n",
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>attributes</th>\n",
       "      <th>datatype</th>\n",
       "      <th>date</th>\n",
       "      <th>station</th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>,,N,</td>\n",
       "      <td>PRCP</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>GHCND:US1CTFR0039</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>,,N,</td>\n",
       "      <td>PRCP</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>GHCND:US1NJBG0015</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>,,N,</td>\n",
       "      <td>SNOW</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>GHCND:US1NJBG0015</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>,,N,</td>\n",
       "      <td>PRCP</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>GHCND:US1NJBG0017</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>,,N,</td>\n",
       "      <td>SNOW</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>GHCND:US1NJBG0017</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  attributes datatype       date            station  value\n",
       "0       ,,N,     PRCP 2018-01-01  GHCND:US1CTFR0039    0.0\n",
       "1       ,,N,     PRCP 2018-01-01  GHCND:US1NJBG0015    0.0\n",
       "2       ,,N,     SNOW 2018-01-01  GHCND:US1NJBG0015    0.0\n",
       "3       ,,N,     PRCP 2018-01-01  GHCND:US1NJBG0017    0.0\n",
       "4       ,,N,     SNOW 2018-01-01  GHCND:US1NJBG0017    0.0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "weather = pd.read_csv('data/nyc_weather_2018.csv', parse_dates=['date'])\n",
    "weather.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.5500</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.3300</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>184.90</td>\n",
       "      <td>186.21</td>\n",
       "      <td>184.0996</td>\n",
       "      <td>184.33</td>\n",
       "      <td>13880896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>185.59</td>\n",
       "      <td>186.90</td>\n",
       "      <td>184.9300</td>\n",
       "      <td>186.85</td>\n",
       "      <td>13574535</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>187.20</td>\n",
       "      <td>188.90</td>\n",
       "      <td>186.3300</td>\n",
       "      <td>188.28</td>\n",
       "      <td>17994726</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high       low   close    volume\n",
       "date                                                  \n",
       "2018-01-02  177.68  181.58  177.5500  181.42  18151903\n",
       "2018-01-03  181.88  184.78  181.3300  184.67  16886563\n",
       "2018-01-04  184.90  186.21  184.0996  184.33  13880896\n",
       "2018-01-05  185.59  186.90  184.9300  186.85  13574535\n",
       "2018-01-08  187.20  188.90  186.3300  188.28  17994726"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb = pd.read_csv('data/fb_2018.csv', index_col='date', parse_dates=True)\n",
    "fb.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Arithmetic and statistics\n",
    "We already saw that we can use mathematical operators like `+` and `/` with dataframes directly. However, we can also use methods, which allow us to specify the axis to perform the calculation over. By default this is per column. Let's find the z-scores for the volume traded and look at the days where this was more than 3 standard deviations from the mean:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>abs_z_score_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-03-19</th>\n",
       "      <td>177.01</td>\n",
       "      <td>177.17</td>\n",
       "      <td>170.06</td>\n",
       "      <td>172.56</td>\n",
       "      <td>88140060</td>\n",
       "      <td>3.145078</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-20</th>\n",
       "      <td>167.47</td>\n",
       "      <td>170.20</td>\n",
       "      <td>161.95</td>\n",
       "      <td>168.15</td>\n",
       "      <td>129851768</td>\n",
       "      <td>5.315169</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-21</th>\n",
       "      <td>164.80</td>\n",
       "      <td>173.40</td>\n",
       "      <td>163.30</td>\n",
       "      <td>169.39</td>\n",
       "      <td>106598834</td>\n",
       "      <td>4.105413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-26</th>\n",
       "      <td>160.82</td>\n",
       "      <td>161.10</td>\n",
       "      <td>149.02</td>\n",
       "      <td>160.06</td>\n",
       "      <td>126116634</td>\n",
       "      <td>5.120845</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-07-26</th>\n",
       "      <td>174.89</td>\n",
       "      <td>180.13</td>\n",
       "      <td>173.75</td>\n",
       "      <td>176.26</td>\n",
       "      <td>169803668</td>\n",
       "      <td>7.393705</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close     volume  abs_z_score_volume\n",
       "date                                                                     \n",
       "2018-03-19  177.01  177.17  170.06  172.56   88140060            3.145078\n",
       "2018-03-20  167.47  170.20  161.95  168.15  129851768            5.315169\n",
       "2018-03-21  164.80  173.40  163.30  169.39  106598834            4.105413\n",
       "2018-03-26  160.82  161.10  149.02  160.06  126116634            5.120845\n",
       "2018-07-26  174.89  180.13  173.75  176.26  169803668            7.393705"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.assign(\n",
    "    abs_z_score_volume=lambda x: x.volume.sub(x.volume.mean()).div(x.volume.std()).abs()\n",
    ").query('abs_z_score_volume > 3')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `rank()` and `pct_change()` to see which days had the largest change in volume traded from the day before:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>volume_pct_change</th>\n",
       "      <th>pct_change_rank</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-12</th>\n",
       "      <td>178.06</td>\n",
       "      <td>181.48</td>\n",
       "      <td>177.40</td>\n",
       "      <td>179.37</td>\n",
       "      <td>77551299</td>\n",
       "      <td>7.087876</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-19</th>\n",
       "      <td>177.01</td>\n",
       "      <td>177.17</td>\n",
       "      <td>170.06</td>\n",
       "      <td>172.56</td>\n",
       "      <td>88140060</td>\n",
       "      <td>2.611789</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-07-26</th>\n",
       "      <td>174.89</td>\n",
       "      <td>180.13</td>\n",
       "      <td>173.75</td>\n",
       "      <td>176.26</td>\n",
       "      <td>169803668</td>\n",
       "      <td>1.628841</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-09-21</th>\n",
       "      <td>166.64</td>\n",
       "      <td>167.25</td>\n",
       "      <td>162.81</td>\n",
       "      <td>162.93</td>\n",
       "      <td>45994800</td>\n",
       "      <td>1.428956</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-26</th>\n",
       "      <td>160.82</td>\n",
       "      <td>161.10</td>\n",
       "      <td>149.02</td>\n",
       "      <td>160.06</td>\n",
       "      <td>126116634</td>\n",
       "      <td>1.352496</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close     volume  volume_pct_change  \\\n",
       "date                                                                       \n",
       "2018-01-12  178.06  181.48  177.40  179.37   77551299           7.087876   \n",
       "2018-03-19  177.01  177.17  170.06  172.56   88140060           2.611789   \n",
       "2018-07-26  174.89  180.13  173.75  176.26  169803668           1.628841   \n",
       "2018-09-21  166.64  167.25  162.81  162.93   45994800           1.428956   \n",
       "2018-03-26  160.82  161.10  149.02  160.06  126116634           1.352496   \n",
       "\n",
       "            pct_change_rank  \n",
       "date                         \n",
       "2018-01-12              1.0  \n",
       "2018-03-19              2.0  \n",
       "2018-07-26              3.0  \n",
       "2018-09-21              4.0  \n",
       "2018-03-26              5.0  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.assign(\n",
    "    volume_pct_change=fb.volume.pct_change(),\n",
    "    pct_change_rank=lambda x: x.volume_pct_change.abs().rank(\n",
    "        ascending=False\n",
    "    )\n",
    ").nsmallest(5, 'pct_change_rank')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "January 12th was when the news that Facebook changed its news feed product to focus more on content from a users' friends over the brands they follow. Given that Facebook's advertising is a key component of its business ([nearly 89% in 2017](https://www.investopedia.com/ask/answers/120114/how-does-facebook-fb-make-money.asp)), many shares were sold and the price dropped in panic:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-11</th>\n",
       "      <td>188.40</td>\n",
       "      <td>188.40</td>\n",
       "      <td>187.38</td>\n",
       "      <td>187.77</td>\n",
       "      <td>9588587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-12</th>\n",
       "      <td>178.06</td>\n",
       "      <td>181.48</td>\n",
       "      <td>177.40</td>\n",
       "      <td>179.37</td>\n",
       "      <td>77551299</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close    volume\n",
       "date                                                \n",
       "2018-01-11  188.40  188.40  187.38  187.77   9588587\n",
       "2018-01-12  178.06  181.48  177.40  179.37  77551299"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-01-11':'2018-01-12']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Throughout 2018, Facebook's stock price never had a low above $215:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "open       True\n",
       "high       True\n",
       "low       False\n",
       "close      True\n",
       "volume     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fb > 215).any()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Facebook's OHLC (open, high, low, and close) prices all had at least one day they were at $215 or less:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "open      False\n",
       "high      False\n",
       "low       False\n",
       "close     False\n",
       "volume     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fb > 215).all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Binning and thresholds\n",
    "When working with the volume traded, we may be interested in ranges of volume rather than the exact values. No two days have the same volume traded:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fb.volume.value_counts() > 1).sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `pd.cut()` to create 3 bins of even an even range in volume traded and name them. Then we can work with low, medium, and high volume traded categories:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "low     240\n",
       "med       8\n",
       "high      3\n",
       "Name: volume, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "volume_binned = pd.cut(fb.volume, bins=3, labels=['low', 'med', 'high'])\n",
    "volume_binned.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-07-26</th>\n",
       "      <td>174.89</td>\n",
       "      <td>180.13</td>\n",
       "      <td>173.75</td>\n",
       "      <td>176.26</td>\n",
       "      <td>169803668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-20</th>\n",
       "      <td>167.47</td>\n",
       "      <td>170.20</td>\n",
       "      <td>161.95</td>\n",
       "      <td>168.15</td>\n",
       "      <td>129851768</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-26</th>\n",
       "      <td>160.82</td>\n",
       "      <td>161.10</td>\n",
       "      <td>149.02</td>\n",
       "      <td>160.06</td>\n",
       "      <td>126116634</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close     volume\n",
       "date                                                 \n",
       "2018-07-26  174.89  180.13  173.75  176.26  169803668\n",
       "2018-03-20  167.47  170.20  161.95  168.15  129851768\n",
       "2018-03-26  160.82  161.10  149.02  160.06  126116634"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb[volume_binned == 'high'].sort_values(\n",
    "    'volume', ascending=False\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "July 25th Facebook announced disappointing user growth and the stock tanked in the after hours:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-07-25</th>\n",
       "      <td>215.715</td>\n",
       "      <td>218.62</td>\n",
       "      <td>214.27</td>\n",
       "      <td>217.50</td>\n",
       "      <td>64592585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-07-26</th>\n",
       "      <td>174.890</td>\n",
       "      <td>180.13</td>\n",
       "      <td>173.75</td>\n",
       "      <td>176.26</td>\n",
       "      <td>169803668</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               open    high     low   close     volume\n",
       "date                                                  \n",
       "2018-07-25  215.715  218.62  214.27  217.50   64592585\n",
       "2018-07-26  174.890  180.13  173.75  176.26  169803668"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-07-25':'2018-07-26']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cambridge Analytica scandal broke on Saturday March 17th, so we look to the Monday for the numbers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-03-16</th>\n",
       "      <td>184.49</td>\n",
       "      <td>185.33</td>\n",
       "      <td>183.41</td>\n",
       "      <td>185.09</td>\n",
       "      <td>24403438</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-19</th>\n",
       "      <td>177.01</td>\n",
       "      <td>177.17</td>\n",
       "      <td>170.06</td>\n",
       "      <td>172.56</td>\n",
       "      <td>88140060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-20</th>\n",
       "      <td>167.47</td>\n",
       "      <td>170.20</td>\n",
       "      <td>161.95</td>\n",
       "      <td>168.15</td>\n",
       "      <td>129851768</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close     volume\n",
       "date                                                 \n",
       "2018-03-16  184.49  185.33  183.41  185.09   24403438\n",
       "2018-03-19  177.01  177.17  170.06  172.56   88140060\n",
       "2018-03-20  167.47  170.20  161.95  168.15  129851768"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-03-16':'2018-03-20']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since most days have similar volume, but a few are very large, we have very wide bins. Most of the data is in the low bin. \n",
    "\n",
    "*Note: visualizations will be covered in chapters [5](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/tree/master/ch_05) and [6](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/tree/master/ch_05).*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fb.plot(y='volume', figsize=(15, 3), title='Daily Volume Traded of Facebook Stock in 2018 (with bins)')\n",
    "\n",
    "for bin_name, alpha, bounds in zip(\n",
    "    ['low', 'med', 'high'], [0.1, 0.2, 0.3], pd.cut(fb.volume, bins=3).unique().categories.values\n",
    "):\n",
    "    plt.axhspan(bounds.left, bounds.right, alpha=alpha, label=bin_name, color='mediumturquoise')\n",
    "    plt.annotate(bin_name, xy=('2017-12-17', (bounds.left + bounds.right)/2.1))\n",
    "    \n",
    "plt.ylabel('volume traded')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we split using quantiles, the bins will have roughly the same number of observations. For this, we use `qcut()`. We will make 4 quartiles:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "q4    63\n",
       "q2    63\n",
       "q1    63\n",
       "q3    62\n",
       "Name: volume, dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "volume_qbinned = pd.qcut(fb.volume, q=4, labels=['q1', 'q2', 'q3', 'q4'])\n",
    "volume_qbinned.value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice the bins don't cover ranges of the same size anymore:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fb.plot(y='volume', figsize=(15, 8), title='Daily Volume Traded of Facebook Stock in 2018 (with quartile bins)')\n",
    "\n",
    "for bin_name, alpha, bounds in zip(\n",
    "    ['q1', 'q2', 'q3', 'q4'], [0.1, 0.35, 0.2, 0.3], pd.qcut(fb.volume, q=4).unique().categories.values\n",
    "):\n",
    "    plt.axhspan(bounds.left, bounds.right, alpha=alpha, label=bin_name, color='mediumturquoise')\n",
    "    plt.annotate(bin_name, xy=('2017-12-17', (bounds.left + bounds.right)/2.1))\n",
    "    \n",
    "plt.ylabel('volume traded')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sometimes we don't want to make bins, but rather cap values at a threshold. Before we look at an example, let's pivot our weather data for the Central Park station:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>datatype</th>\n",
       "      <th>AWND</th>\n",
       "      <th>PRCP</th>\n",
       "      <th>SNOW</th>\n",
       "      <th>SNWD</th>\n",
       "      <th>TMAX</th>\n",
       "      <th>TMIN</th>\n",
       "      <th>WDF2</th>\n",
       "      <th>WDF5</th>\n",
       "      <th>WSF2</th>\n",
       "      <th>WSF5</th>\n",
       "      <th>WT01</th>\n",
       "      <th>WT02</th>\n",
       "      <th>WT03</th>\n",
       "      <th>WT06</th>\n",
       "      <th>WT08</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-01</th>\n",
       "      <td>3.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-7.1</td>\n",
       "      <td>-13.8</td>\n",
       "      <td>300.0</td>\n",
       "      <td>300.0</td>\n",
       "      <td>6.7</td>\n",
       "      <td>11.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>3.6</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-3.2</td>\n",
       "      <td>-10.5</td>\n",
       "      <td>260.0</td>\n",
       "      <td>250.0</td>\n",
       "      <td>7.2</td>\n",
       "      <td>12.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>1.4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>-8.8</td>\n",
       "      <td>260.0</td>\n",
       "      <td>270.0</td>\n",
       "      <td>6.3</td>\n",
       "      <td>9.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>5.6</td>\n",
       "      <td>19.3</td>\n",
       "      <td>249.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>-1.6</td>\n",
       "      <td>-7.1</td>\n",
       "      <td>310.0</td>\n",
       "      <td>310.0</td>\n",
       "      <td>10.7</td>\n",
       "      <td>19.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>5.8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>180.0</td>\n",
       "      <td>-7.1</td>\n",
       "      <td>-12.7</td>\n",
       "      <td>280.0</td>\n",
       "      <td>280.0</td>\n",
       "      <td>9.4</td>\n",
       "      <td>15.7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "datatype    AWND  PRCP   SNOW   SNWD  TMAX  TMIN   WDF2   WDF5  WSF2  WSF5  \\\n",
       "date                                                                         \n",
       "2018-01-01   3.5   0.0    0.0    0.0  -7.1 -13.8  300.0  300.0   6.7  11.2   \n",
       "2018-01-02   3.6   0.0    0.0    0.0  -3.2 -10.5  260.0  250.0   7.2  12.5   \n",
       "2018-01-03   1.4   0.0    0.0    0.0  -1.0  -8.8  260.0  270.0   6.3   9.8   \n",
       "2018-01-04   5.6  19.3  249.0   30.0  -1.6  -7.1  310.0  310.0  10.7  19.2   \n",
       "2018-01-05   5.8   0.0    0.0  180.0  -7.1 -12.7  280.0  280.0   9.4  15.7   \n",
       "\n",
       "datatype    WT01  WT02  WT03  WT06  WT08  \n",
       "date                                      \n",
       "2018-01-01   NaN   NaN   NaN   NaN   NaN  \n",
       "2018-01-02   NaN   NaN   NaN   NaN   NaN  \n",
       "2018-01-03   NaN   NaN   NaN   NaN   NaN  \n",
       "2018-01-04   1.0   1.0   NaN   NaN   1.0  \n",
       "2018-01-05   NaN   NaN   NaN   NaN   NaN  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather = weather.query(\n",
    "    'station == \"GHCND:USW00094728\"'\n",
    ").pivot(index='date', columns='datatype', values='value')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Say we don't care how much snow their was, just that it snowed in Central Park. However, we don't want to make a Boolean column since we need to preserve the data type of float. We can use `clip()` to replace values above a upper threshold with the threshold and replace values below a lower threshold with the lower threshold. This means we can use `clip(0, 1)` to change all the snow values of one or more to 1, which easily shows us the days snow was recorded in Central Park. Preserving the data type will save some work later on if we are building a model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0    354\n",
       "1.0     11\n",
       "Name: SNOW, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather.SNOW.clip(0, 1).value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Note: the `clip()` method can also be called on the dataframe itself.*\n",
    "\n",
    "## Applying Functions\n",
    "We can use the `apply()` method to run the same operation on all columns (or rows) of the dataframe. Let's calculate the z-scores of the TMIN, TMAX, and PRCP observations in Central Park in October 2018:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>25%</th>\n",
       "      <th>50%</th>\n",
       "      <th>75%</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datatype</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>TMIN</th>\n",
       "      <td>31.0</td>\n",
       "      <td>-1.790682e-16</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.339112</td>\n",
       "      <td>-0.751019</td>\n",
       "      <td>-0.474269</td>\n",
       "      <td>1.065152</td>\n",
       "      <td>1.843511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TMAX</th>\n",
       "      <td>31.0</td>\n",
       "      <td>1.951844e-16</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.305582</td>\n",
       "      <td>-0.870013</td>\n",
       "      <td>-0.138258</td>\n",
       "      <td>1.011643</td>\n",
       "      <td>1.604016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PRCP</th>\n",
       "      <td>31.0</td>\n",
       "      <td>4.655774e-17</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.394438</td>\n",
       "      <td>-0.394438</td>\n",
       "      <td>-0.394438</td>\n",
       "      <td>-0.240253</td>\n",
       "      <td>3.936167</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          count          mean  std       min       25%       50%       75%  \\\n",
       "datatype                                                                     \n",
       "TMIN       31.0 -1.790682e-16  1.0 -1.339112 -0.751019 -0.474269  1.065152   \n",
       "TMAX       31.0  1.951844e-16  1.0 -1.305582 -0.870013 -0.138258  1.011643   \n",
       "PRCP       31.0  4.655774e-17  1.0 -0.394438 -0.394438 -0.394438 -0.240253   \n",
       "\n",
       "               max  \n",
       "datatype            \n",
       "TMIN      1.843511  \n",
       "TMAX      1.604016  \n",
       "PRCP      3.936167  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "oct_weather_z_scores = central_park_weather.loc[\n",
    "    '2018-10', ['TMIN', 'TMAX', 'PRCP']\n",
    "].apply(lambda x: x.sub(x.mean()).div(x.std()))\n",
    "oct_weather_z_scores.describe().T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "October 27th rained much more than the rest of the days:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>datatype</th>\n",
       "      <th>TMIN</th>\n",
       "      <th>TMAX</th>\n",
       "      <th>PRCP</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-27</th>\n",
       "      <td>-0.751019</td>\n",
       "      <td>-1.201045</td>\n",
       "      <td>3.936167</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "datatype        TMIN      TMAX      PRCP\n",
       "date                                    \n",
       "2018-10-27 -0.751019 -1.201045  3.936167"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "oct_weather_z_scores.query('PRCP > 3')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Indeed, this day was much higher than the rest:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    31.000000\n",
       "mean      2.941935\n",
       "std       7.458542\n",
       "min       0.000000\n",
       "25%       0.000000\n",
       "50%       0.000000\n",
       "75%       1.150000\n",
       "max      32.300000\n",
       "Name: PRCP, dtype: float64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather.loc['2018-10', 'PRCP'].describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When the function we want to apply isn't vectorized, we can:\n",
    "- use `np.vectorize()` to vectorize it (similar to how `map()` works) and then use it with `apply()`\n",
    "- use `applymap()` and pass it the non-vectorized function directly\n",
    "\n",
    "Say we wanted to count the digits of the whole numbers for the Facebook data. `len()` is not vectorized:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "fb.apply(\n",
    "    lambda x: np.vectorize(lambda y: len(str(np.ceil(y))))(x)\n",
    ").astype('int64').equals(\n",
    "    fb.applymap(lambda x: len(str(np.ceil(x))))\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A simple operation of addition to each element in a series grows linearly in time complexity when using `iteritems()`, but stays near 0 when using vectorized operations. `iteritems()` and related methods should only be used if there is no vectorized solution:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "np.random.seed(0)\n",
    "\n",
    "vectorized_results = {}\n",
    "iteritems_results = {}\n",
    "\n",
    "for size in [10, 100, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000]:\n",
    "    test = pd.Series(np.random.uniform(size=size))\n",
    "    \n",
    "    start = time.time()\n",
    "    x = test + 10\n",
    "    end = time.time()\n",
    "    vectorized_results[size] = end - start\n",
    "    \n",
    "    start = time.time()\n",
    "    x = []\n",
    "    for i, v in test.iteritems():\n",
    "        x.append(v + 10)\n",
    "    x = pd.Series(x)\n",
    "    end = time.time()\n",
    "    iteritems_results[size] = end - start\n",
    "\n",
    "pd.DataFrame(\n",
    "    [pd.Series(vectorized_results, name='vectorized'), pd.Series(iteritems_results, name='iteritems')]\n",
    ").T.plot(title='Time Complexity of Vectorized Operations vs. iteritems()')\n",
    "plt.xlabel('item size (rows)')\n",
    "plt.ylabel('time')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Window Calculations\n",
    "*Consult the [understanding_window_calculations.ipynb notebook](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/blob/master/ch_04/understanding_window_calculations.ipynb) for interactive visualizations to help understand window calculations.*\n",
    "\n",
    "The `rolling()` method allows us to perform rolling window calculations. We simply specify the window size (3 days here) and follow it with a call to an aggregation function (sum here):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>date</th>\n",
       "      <th>2018-10-01 00:00:00</th>\n",
       "      <th>2018-10-02 00:00:00</th>\n",
       "      <th>2018-10-03 00:00:00</th>\n",
       "      <th>2018-10-04 00:00:00</th>\n",
       "      <th>2018-10-05 00:00:00</th>\n",
       "      <th>2018-10-06 00:00:00</th>\n",
       "      <th>2018-10-07 00:00:00</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datatype</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>PRCP</th>\n",
       "      <td>0.0</td>\n",
       "      <td>17.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rolling_PRCP</th>\n",
       "      <td>0.0</td>\n",
       "      <td>17.5</td>\n",
       "      <td>17.5</td>\n",
       "      <td>18.5</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "date          2018-10-01  2018-10-02  2018-10-03  2018-10-04  2018-10-05  \\\n",
       "datatype                                                                   \n",
       "PRCP                 0.0        17.5         0.0         1.0         0.0   \n",
       "rolling_PRCP         0.0        17.5        17.5        18.5         1.0   \n",
       "\n",
       "date          2018-10-06  2018-10-07  \n",
       "datatype                              \n",
       "PRCP                 0.0         0.0  \n",
       "rolling_PRCP         1.0         0.0  "
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather['2018-10'].assign(\n",
    "    rolling_PRCP=lambda x: x.PRCP.rolling('3D').sum()\n",
    ")[['PRCP', 'rolling_PRCP']].head(7).T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also perform the rolling calculations on the entire dataframe at once. This will apply the same aggregation function to each column:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>datatype</th>\n",
       "      <th>AWND</th>\n",
       "      <th>PRCP</th>\n",
       "      <th>SNOW</th>\n",
       "      <th>SNWD</th>\n",
       "      <th>TMAX</th>\n",
       "      <th>TMIN</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-01</th>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.400000</td>\n",
       "      <td>17.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-02</th>\n",
       "      <td>0.900000</td>\n",
       "      <td>8.750000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.700000</td>\n",
       "      <td>17.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-03</th>\n",
       "      <td>0.966667</td>\n",
       "      <td>5.833333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.233333</td>\n",
       "      <td>17.566667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-04</th>\n",
       "      <td>0.800000</td>\n",
       "      <td>6.166667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.233333</td>\n",
       "      <td>17.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-05</th>\n",
       "      <td>1.033333</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>23.133333</td>\n",
       "      <td>16.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-06</th>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22.033333</td>\n",
       "      <td>16.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-07</th>\n",
       "      <td>1.066667</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>22.600000</td>\n",
       "      <td>17.400000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "datatype        AWND      PRCP  SNOW  SNWD       TMAX       TMIN\n",
       "date                                                            \n",
       "2018-10-01  0.900000  0.000000   0.0   0.0  24.400000  17.200000\n",
       "2018-10-02  0.900000  8.750000   0.0   0.0  24.700000  17.750000\n",
       "2018-10-03  0.966667  5.833333   0.0   0.0  24.233333  17.566667\n",
       "2018-10-04  0.800000  6.166667   0.0   0.0  24.233333  17.200000\n",
       "2018-10-05  1.033333  0.333333   0.0   0.0  23.133333  16.300000\n",
       "2018-10-06  0.833333  0.333333   0.0   0.0  22.033333  16.300000\n",
       "2018-10-07  1.066667  0.000000   0.0   0.0  22.600000  17.400000"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather['2018-10'].rolling('3D').mean().head(7).iloc[:,:6]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use different aggregation functions per column if we use `agg()` instead. We pass in a dictionary mapping the column to the aggregation to perform on it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AWND</th>\n",
       "      <th>AWND_rolling</th>\n",
       "      <th>PRCP</th>\n",
       "      <th>PRCP_rolling</th>\n",
       "      <th>TMAX</th>\n",
       "      <th>TMAX_rolling</th>\n",
       "      <th>TMIN</th>\n",
       "      <th>TMIN_rolling</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-01</th>\n",
       "      <td>0.9</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.4</td>\n",
       "      <td>24.4</td>\n",
       "      <td>17.2</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-02</th>\n",
       "      <td>0.9</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>17.5</td>\n",
       "      <td>17.5</td>\n",
       "      <td>25.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>18.3</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-03</th>\n",
       "      <td>1.1</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17.5</td>\n",
       "      <td>23.3</td>\n",
       "      <td>25.0</td>\n",
       "      <td>17.2</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-04</th>\n",
       "      <td>0.4</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>18.5</td>\n",
       "      <td>24.4</td>\n",
       "      <td>25.0</td>\n",
       "      <td>16.1</td>\n",
       "      <td>16.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-05</th>\n",
       "      <td>1.6</td>\n",
       "      <td>1.033333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>21.7</td>\n",
       "      <td>24.4</td>\n",
       "      <td>15.6</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-06</th>\n",
       "      <td>0.5</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>24.4</td>\n",
       "      <td>17.2</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-07</th>\n",
       "      <td>1.1</td>\n",
       "      <td>1.066667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>26.1</td>\n",
       "      <td>26.1</td>\n",
       "      <td>19.4</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            AWND  AWND_rolling  PRCP  PRCP_rolling  TMAX  TMAX_rolling  TMIN  \\\n",
       "date                                                                           \n",
       "2018-10-01   0.9      0.900000   0.0           0.0  24.4          24.4  17.2   \n",
       "2018-10-02   0.9      0.900000  17.5          17.5  25.0          25.0  18.3   \n",
       "2018-10-03   1.1      0.966667   0.0          17.5  23.3          25.0  17.2   \n",
       "2018-10-04   0.4      0.800000   1.0          18.5  24.4          25.0  16.1   \n",
       "2018-10-05   1.6      1.033333   0.0           1.0  21.7          24.4  15.6   \n",
       "2018-10-06   0.5      0.833333   0.0           1.0  20.0          24.4  17.2   \n",
       "2018-10-07   1.1      1.066667   0.0           0.0  26.1          26.1  19.4   \n",
       "\n",
       "            TMIN_rolling  \n",
       "date                      \n",
       "2018-10-01          17.2  \n",
       "2018-10-02          17.2  \n",
       "2018-10-03          17.2  \n",
       "2018-10-04          16.1  \n",
       "2018-10-05          15.6  \n",
       "2018-10-06          15.6  \n",
       "2018-10-07          15.6  "
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather['2018-10-01':'2018-10-07'].rolling('3D').agg(\n",
    "    {'TMAX': 'max', 'TMIN': 'min', 'AWND': 'mean', 'PRCP': 'sum'}\n",
    ").join( # join with original data for comparison\n",
    "    central_park_weather[['TMAX', 'TMIN', 'AWND', 'PRCP']], \n",
    "    lsuffix='_rolling'\n",
    ").sort_index(axis=1) # sort columns so rolling calcs are next to originals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rolling calculations (`rolling()`) use a sliding window. Expanding calculations (`expanding()`) however grow in size. These are equivalent to cumulative aggregations like `cumsum()`; however, we can specify the minimum number of periods required to start calculating (default is 1):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather.PRCP.expanding().sum().equals(central_park_weather.PRCP.cumsum())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Separate expanding aggregations per column. Note that `agg()` will accept numpy functions too:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AWND</th>\n",
       "      <th>AWND_expanding</th>\n",
       "      <th>PRCP</th>\n",
       "      <th>PRCP_expanding</th>\n",
       "      <th>TMAX</th>\n",
       "      <th>TMAX_expanding</th>\n",
       "      <th>TMIN</th>\n",
       "      <th>TMIN_expanding</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-01</th>\n",
       "      <td>0.9</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24.4</td>\n",
       "      <td>24.4</td>\n",
       "      <td>17.2</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-02</th>\n",
       "      <td>0.9</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>17.5</td>\n",
       "      <td>17.5</td>\n",
       "      <td>25.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>18.3</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-03</th>\n",
       "      <td>1.1</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17.5</td>\n",
       "      <td>23.3</td>\n",
       "      <td>25.0</td>\n",
       "      <td>17.2</td>\n",
       "      <td>17.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-04</th>\n",
       "      <td>0.4</td>\n",
       "      <td>0.825000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>18.5</td>\n",
       "      <td>24.4</td>\n",
       "      <td>25.0</td>\n",
       "      <td>16.1</td>\n",
       "      <td>16.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-05</th>\n",
       "      <td>1.6</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18.5</td>\n",
       "      <td>21.7</td>\n",
       "      <td>25.0</td>\n",
       "      <td>15.6</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-06</th>\n",
       "      <td>0.5</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18.5</td>\n",
       "      <td>20.0</td>\n",
       "      <td>25.0</td>\n",
       "      <td>17.2</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-07</th>\n",
       "      <td>1.1</td>\n",
       "      <td>0.928571</td>\n",
       "      <td>0.0</td>\n",
       "      <td>18.5</td>\n",
       "      <td>26.1</td>\n",
       "      <td>26.1</td>\n",
       "      <td>19.4</td>\n",
       "      <td>15.6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            AWND  AWND_expanding  PRCP  PRCP_expanding  TMAX  TMAX_expanding  \\\n",
       "date                                                                           \n",
       "2018-10-01   0.9        0.900000   0.0             0.0  24.4            24.4   \n",
       "2018-10-02   0.9        0.900000  17.5            17.5  25.0            25.0   \n",
       "2018-10-03   1.1        0.966667   0.0            17.5  23.3            25.0   \n",
       "2018-10-04   0.4        0.825000   1.0            18.5  24.4            25.0   \n",
       "2018-10-05   1.6        0.980000   0.0            18.5  21.7            25.0   \n",
       "2018-10-06   0.5        0.900000   0.0            18.5  20.0            25.0   \n",
       "2018-10-07   1.1        0.928571   0.0            18.5  26.1            26.1   \n",
       "\n",
       "            TMIN  TMIN_expanding  \n",
       "date                              \n",
       "2018-10-01  17.2            17.2  \n",
       "2018-10-02  18.3            17.2  \n",
       "2018-10-03  17.2            17.2  \n",
       "2018-10-04  16.1            16.1  \n",
       "2018-10-05  15.6            15.6  \n",
       "2018-10-06  17.2            15.6  \n",
       "2018-10-07  19.4            15.6  "
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "central_park_weather['2018-10-01':'2018-10-07'].expanding().agg(\n",
    "    {'TMAX': np.max, 'TMIN': np.min, 'AWND': np.mean, 'PRCP': np.sum}\n",
    ").join(\n",
    "    central_park_weather[['TMAX', 'TMIN', 'AWND', 'PRCP']], \n",
    "    lsuffix='_expanding'\n",
    ").sort_index(axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can calculate the exponentially weighted moving average as follows. Note that `span` here is the periods to use:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>close</th>\n",
       "      <th>close_ewma</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-12-17</th>\n",
       "      <td>140.19</td>\n",
       "      <td>142.235433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-18</th>\n",
       "      <td>143.66</td>\n",
       "      <td>142.710289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-19</th>\n",
       "      <td>133.24</td>\n",
       "      <td>139.553526</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-20</th>\n",
       "      <td>133.40</td>\n",
       "      <td>137.502350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-21</th>\n",
       "      <td>124.95</td>\n",
       "      <td>133.318234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-24</th>\n",
       "      <td>124.06</td>\n",
       "      <td>130.232156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-26</th>\n",
       "      <td>134.18</td>\n",
       "      <td>131.548104</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-27</th>\n",
       "      <td>134.52</td>\n",
       "      <td>132.538736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-28</th>\n",
       "      <td>133.20</td>\n",
       "      <td>132.759157</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-31</th>\n",
       "      <td>131.09</td>\n",
       "      <td>132.202772</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             close  close_ewma\n",
       "date                          \n",
       "2018-12-17  140.19  142.235433\n",
       "2018-12-18  143.66  142.710289\n",
       "2018-12-19  133.24  139.553526\n",
       "2018-12-20  133.40  137.502350\n",
       "2018-12-21  124.95  133.318234\n",
       "2018-12-24  124.06  130.232156\n",
       "2018-12-26  134.18  131.548104\n",
       "2018-12-27  134.52  132.538736\n",
       "2018-12-28  133.20  132.759157\n",
       "2018-12-31  131.09  132.202772"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.assign(\n",
    "    close_ewma=lambda x: x.close.ewm(span=5).mean()\n",
    ").tail(10)[['close', 'close_ewma']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Consult the [understanding_window_calculations.ipynb notebook](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/blob/master/ch_04/understanding_window_calculations.ipynb) for interactive visualizations to help understand window calculations.*\n",
    "\n",
    "## Pipes\n",
    "Pipes all use to apply any function that accepts our data as the first argument and pass in any additional arguments. This makes it easy to chain steps together regardless of if they are methods or functions:\n",
    "\n",
    "We can pass any function that will accept the caller of `pipe()` as the first argument:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_info(df):\n",
    "    return '%d rows and %d columns and max closing z-score was %d' % (*df.shape, df.close.max())\n",
    "\n",
    "fb['2018-Q1'].apply(lambda x: (x - x.mean())/x.std()).pipe(get_info)\\\n",
    "    == get_info(fb['2018-Q1'].apply(lambda x: (x - x.mean())/x.std()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For example, passing `pd.DataFrame.rolling` to `pipe()` is equivalent to calling `rolling()` directly on the dataframe, except we have more flexiblity to change this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.pipe(pd.DataFrame.rolling, '20D').mean().equals(fb.rolling('20D').mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The pipe takes the function passed in and calls it with the object that called `pipe()` as the first argument. Positional and keyword arguments are passed down:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame.rolling(fb, '20D').mean().equals(fb.rolling('20D').mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use a pipe to make a function that we can use for all our window calculation needs:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[1;31mSignature:\u001b[0m \u001b[0mwindow_calc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0magg_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
       "\u001b[1;31mSource:\u001b[0m   \n",
       "\u001b[1;32mdef\u001b[0m \u001b[0mwindow_calc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0magg_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\n",
       "\u001b[0m    \u001b[1;34m\"\"\"\n",
       "    Run a window calculation of your choice on a DataFrame.\n",
       "    \n",
       "    Parameters:\n",
       "        - df: The DataFrame to run the calculation on.\n",
       "        - func: The window calculation method that takes df \n",
       "                as the first argument.\n",
       "        - agg_dict: Information to pass to `agg()`, could be a \n",
       "                    dictionary mapping the columns to the aggregation \n",
       "                    function to use, a string name for the function, \n",
       "                    or the function itself.\n",
       "        - args: Positional arguments to pass to `func`.\n",
       "        - kwargs: Keyword arguments to pass to `func`.\n",
       "    \n",
       "    Returns:\n",
       "        - A new DataFrame object.\n",
       "    \"\"\"\u001b[0m\u001b[1;33m\n",
       "\u001b[0m    \u001b[1;32mreturn\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpipe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0magg\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0magg_dict\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
       "\u001b[1;31mFile:\u001b[0m      c:\\users\\molinstefanie\\packt\\hands-on-data-analysis-with-pandas\\ch_04\\window_calc.py\n",
       "\u001b[1;31mType:\u001b[0m      function\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from window_calc import window_calc\n",
    "window_calc??"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the same interface to calculate various window calculations now. Let's find the expanding median for the Facebook data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.580</td>\n",
       "      <td>177.5500</td>\n",
       "      <td>181.420</td>\n",
       "      <td>18151903.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>179.78</td>\n",
       "      <td>183.180</td>\n",
       "      <td>179.4400</td>\n",
       "      <td>183.045</td>\n",
       "      <td>17519233.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.780</td>\n",
       "      <td>181.3300</td>\n",
       "      <td>184.330</td>\n",
       "      <td>16886563.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>183.39</td>\n",
       "      <td>185.495</td>\n",
       "      <td>182.7148</td>\n",
       "      <td>184.500</td>\n",
       "      <td>15383729.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>184.90</td>\n",
       "      <td>186.210</td>\n",
       "      <td>184.0996</td>\n",
       "      <td>184.670</td>\n",
       "      <td>16886563.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open     high       low    close      volume\n",
       "date                                                      \n",
       "2018-01-02  177.68  181.580  177.5500  181.420  18151903.0\n",
       "2018-01-03  179.78  183.180  179.4400  183.045  17519233.0\n",
       "2018-01-04  181.88  184.780  181.3300  184.330  16886563.0\n",
       "2018-01-05  183.39  185.495  182.7148  184.500  15383729.5\n",
       "2018-01-08  184.90  186.210  184.0996  184.670  16886563.0"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_calc(fb, pd.DataFrame.expanding, np.median).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using the exponentially weighted moving average requires we pass in a keyword argument:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>177.680000</td>\n",
       "      <td>181.580000</td>\n",
       "      <td>177.550000</td>\n",
       "      <td>181.420000</td>\n",
       "      <td>1.815190e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>180.480000</td>\n",
       "      <td>183.713333</td>\n",
       "      <td>180.070000</td>\n",
       "      <td>183.586667</td>\n",
       "      <td>1.730834e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>183.005714</td>\n",
       "      <td>185.140000</td>\n",
       "      <td>182.372629</td>\n",
       "      <td>184.011429</td>\n",
       "      <td>1.534980e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>184.384000</td>\n",
       "      <td>186.078667</td>\n",
       "      <td>183.736560</td>\n",
       "      <td>185.525333</td>\n",
       "      <td>1.440299e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>185.837419</td>\n",
       "      <td>187.534839</td>\n",
       "      <td>185.075110</td>\n",
       "      <td>186.947097</td>\n",
       "      <td>1.625679e+07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  open        high         low       close        volume\n",
       "date                                                                    \n",
       "2018-01-02  177.680000  181.580000  177.550000  181.420000  1.815190e+07\n",
       "2018-01-03  180.480000  183.713333  180.070000  183.586667  1.730834e+07\n",
       "2018-01-04  183.005714  185.140000  182.372629  184.011429  1.534980e+07\n",
       "2018-01-05  184.384000  186.078667  183.736560  185.525333  1.440299e+07\n",
       "2018-01-08  185.837419  187.534839  185.075110  186.947097  1.625679e+07"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_calc(fb, pd.DataFrame.ewm, 'mean', span=3).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With rolling calculations, we can pass in a positional argument for the window size:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TMAX</th>\n",
       "      <th>TMIN</th>\n",
       "      <th>AWND</th>\n",
       "      <th>PRCP</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-01</th>\n",
       "      <td>24.4</td>\n",
       "      <td>17.2</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-02</th>\n",
       "      <td>25.0</td>\n",
       "      <td>17.2</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>17.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-03</th>\n",
       "      <td>25.0</td>\n",
       "      <td>17.2</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>17.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-04</th>\n",
       "      <td>25.0</td>\n",
       "      <td>16.1</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>18.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-05</th>\n",
       "      <td>24.4</td>\n",
       "      <td>15.6</td>\n",
       "      <td>1.033333</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            TMAX  TMIN      AWND  PRCP\n",
       "date                                  \n",
       "2018-10-01  24.4  17.2  0.900000   0.0\n",
       "2018-10-02  25.0  17.2  0.900000  17.5\n",
       "2018-10-03  25.0  17.2  0.966667  17.5\n",
       "2018-10-04  25.0  16.1  0.800000  18.5\n",
       "2018-10-05  24.4  15.6  1.033333   1.0"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_calc(\n",
    "    central_park_weather['2018-10'], \n",
    "    pd.DataFrame.rolling, \n",
    "    {'TMAX': 'max', 'TMIN': 'min', 'AWND': 'mean', 'PRCP': 'sum'},\n",
    "    '3D'\n",
    ").head()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
